﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CBE.Model.Entities;
using Common.Model;

namespace CBE.Model.DataAccess
{
    public class AdministrarComprasDataAccess : GenericEntityManagerDataAccess<Compras, AdministrarComprasCriteria, AdministrarComprasView, CBEEntities>
    {
        public AdministrarComprasDataAccess()
            : base()
        {
            this.RelatedEntitySets.Add("ProductosCompra");
        }

        protected override Compras ReadEntity(Guid id)
        {
            return ObjectContext.Compras.
                Include("ProductosCompra").
                Include("ProductosCompra.Productos").
                Include("Proveedores").
                Where(compra => compra.ID_Compra == id).
                FirstOrDefault();
        }

        public override List<AdministrarComprasView> Read(AdministrarComprasCriteria criteria)
        {
            return ObjectContext.Compras.
                Where(compra => (String.IsNullOrEmpty(criteria.NroComprobante) || compra.NroComprobante.Contains(criteria.NroComprobante)) &&
                                (criteria.IDProveedor == Guid.Empty || compra.Proveedores.ID_Proveedor == criteria.IDProveedor) &&
                                (criteria.IDProducto == Guid.Empty || compra.ProductosCompra.Any(prod => prod.Productos.ID_Producto == criteria.IDProducto)) &&
                                (!criteria.FechaDesde.HasValue || compra.FechaRecepcion >= criteria.FechaDesde.Value) &&
                                (!criteria.FechaHasta.HasValue || compra.FechaRecepcion <= criteria.FechaHasta.Value) &&
                                compra.Activo == true
                      ).
                Select(compra => new AdministrarComprasView
                {
                    ID = compra.ID_Compra,
                    FechaRecepcion = compra.FechaRecepcion,
                    Monto = compra.ImporteCompra,
                    NombreProveedor = compra.Proveedores.RazonSocial,
                    NroComprobante = compra.NroComprobante,
                    Productos = compra.ProductosCompra.Select(p => p.Productos.Descripcion)
                }).OrderByDescending(com => com.FechaRecepcion).ToList();
        }

        public override void Save(Compras entity)
        {

            if (entity.EntityState == System.Data.EntityState.Added)
            {
                foreach (var item in entity.ProductosCompra)
                {
                    item.Productos.Stock += item.Cantidad.HasValue ? item.Cantidad.Value : 0;
                }
            }

            base.Save(entity);
        }

        public void Cancelar(ViewEntity viewEntity)
        {
            var entity = this.Read(viewEntity.ID);

            entity.Activo = false;

            foreach (var item in entity.ProductosCompra)
            {
                item.Productos.Stock -= item.Cantidad.HasValue ? item.Cantidad.Value : 0;
            }

            this.Save(entity);
        }
    }
}
